// map/reduce filter/sort
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

var results = arr.map((x) => Math.pow(x, 2)); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);

var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
list.map(String);

// "123126" to 123126
// not use Number() or parseInt
function str2int(instr) 
{  
    const arr = instr.split("").map(eval);   
    return arr.reduce((x, y) => 10*x + y);  
}    

// 变为首字母大写，其他小写的规范名字
var strs = ['adam', 'LISA', 'barT'];
function normalize(arr) 
{   // s.slice(start, end)
	return arr.map(s =>  s[0].toUpperCase() + s.slice(1).toLowerCase() );
}

//  use map on a String to get an array of bytes in the ASCII
var map = Array.prototype.map;
// call函数
var a = map.call('Hello World', function(x) { 
  return x.charCodeAt(0); 
}); // a now equals [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

// arr.map(parseInt) --> [1, NaN, NaN].  or use arr.map(returnInt) 
/* function returnInt(element) {
      return parseInt(element, 10);
   }
} */
var nums = ['1', '2', '3'];
console.log(arr.map(eval));


// reduce 累计处理
// Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上，
// 这个函数必须接收两个参数，reduce()把结果继续和序列的下一个元素做累积计算
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x + y;
});

// 累乘
var list = [1, 2, 3, 4, 5];
console.log(list.reduce((x, y) => x * y));

// 个十百千位数
var nums = [1, 2, 3, 4, 5, 6]; 
console.log(list.reduce((x, y) => 10*x + y));  // 123456


// filter, 留下条件为true值
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
    return x % 2 !== 0;
})

var arr = ['A', '', 'B', null, undefined, 'C', '  '];
var r = arr.filter(function (s) {
    return s && s.trim(); // 去除空字符串
}); // ['A', 'B', 'C']

var arr = ['A', 'B', 'C']; // callback funtion has three parm
var r = arr.filter(function (element, index, self) {
    console.log(element); // 依次打印'A', 'B', 'C'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // self就是变量arr
    return true;
});

// filter去重， 往往value和index一对一,利用重复元素不匹配
var r = 0；
var arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
r = arr.filter(function (element, index, self) {
    return self.indexOf(element) === index;
});

// 用filter()筛选出素数
function get_primes(arr) {
	var result = [1, ]
	for (let i = 2; i < arr.length; i++) {
		if ( arr.indexOf(i) != -1 ) {
			result.push(i);
			arr = arr.filter(x => x / i !== 0);
		}
	} 
	return result.concat(arr);
}

